package xhw.test;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @Date 2023/11/17 15:43
 * @Author huangdw
 */

//作业：没完成
//写一个程序实现内存溢出然后思考怎么去处理
public class Outofmemory {

    //xhw.test = INFO

    //定义一个日志记录器
    private static final Logger logger = LoggerFactory.getLogger(Outofmemory.class);

    public static void main(String[] args) {
        List<byte[]> list = new ArrayList<>();
        int iterations = 10000; //模拟大量数据
        int nowtry = 0; //当前尝试次数
        int maxtry = 5; //最大尝试次数
        while (nowtry < maxtry) {
            try {
                for (int i = 0; i < iterations; i++) {
                    byte[] byteArray = new byte[2048 * 1024]; // 创建1MB大小的Byte数组
                    list.add(byteArray);
                    //使用占位符来输出

                    if (logger.isDebugEnabled()) {
                        logger.debug("已添加 {} 个1MB大小的数组", i);
                    }
                }
            } catch (OutOfMemoryError e) {
                //当前尝试数增加一
                nowtry++;
                if (logger.isErrorEnabled()) {
                    logger.error("内存溢出异常：" + e.getMessage());
                }

                if (logger.isWarnEnabled()) {
                    logger.warn("内存溢出现在第{}次，正在等待垃圾回收器清理内存", nowtry);
                }

                try {
                    //等待5秒钟给垃圾回收器清理垃圾
                    Thread.sleep(5000);
                } catch (InterruptedException ex) {
                    if (logger.isErrorEnabled()) {
                        logger.error("线程被中断,{}", ex.getMessage(), ex);
                    }
                }

            }
        }
    }
}
